#include <my_head.h>

typedef struct _Msg{
    char type;      // 操作码  'L' 登录  'C' 群聊  'Q' 退出
    char name[32];  // 用户名
    char data[256]; // 消息
}msg_t;

int main(int argc, const char *argv[]){
    if(3 != argc){
        printf("Usage : %s <IP> <PORT>\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    // 创建套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(-1 == sockfd)
        ERR_LOG("socket error");
    
    // 填充 服务器! 网络信息结构体
    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
    socklen_t serveraddr_len = sizeof(serveraddr);

    msg_t msg;
    // 输入用户名
    printf("请输入用户名:");
    fgets(msg.name, sizeof(msg.name), stdin);
    msg.name[strlen(msg.name)-1] = '\0';
    // 完成登录操作
    msg.type = 'L';
    strcpy(msg.data, "加入群聊");
    if(-1 == sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&serveraddr, serveraddr_len)){
        ERR_LOG("sendto error");
    }
    
    // 创建父子进程
    pid_t pid = 0;
    if(-1 == (pid = fork())){
        ERR_LOG("fork error");
    }else if(0 < pid){
        // 父进程 负责 在终端获取数据 并发给服务器
        msg.type = 'C'; // 群聊
        while(1){
            fgets(msg.data, sizeof(msg.data), stdin);
            msg.data[strlen(msg.data)-1] = '\0';
            if(!strcmp(msg.data, "quit")){
                msg.type = 'Q';
                strcpy(msg.data, "退出群聊");
            }
            // 给服务器发送数据
            if(-1 == sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&serveraddr, serveraddr_len)){
                ERR_LOG("sendto error");
            }
            if('Q' == msg.type){
                break;
            }
        }
        // 关闭套接字
        close(sockfd);
        // 父进程退出前先杀死子进程 否则子进程无法退出
        kill(pid, SIGKILL);
        exit(EXIT_SUCCESS);
    }else if(0 == pid){
        // 子进程 负责 接收服务器发来的消息并打印到终端
        while(1){
            if(-1 == recvfrom(sockfd, &msg, sizeof(msg), 0, NULL, NULL)){
                ERR_LOG("recvfrom error");
            }
            printf("%-10s : %s\n", msg.name, msg.data);
        }
    }
    return 0;
}